package Experimentos;

import java.io.IOException;
import java.util.ArrayList;

import IA.DistFS.Servers.WrongParametersException;
import aima.search.framework.Problem;
import aima.search.framework.Search;
import aima.search.framework.SearchAgent;
import aima.search.informed.SimulatedAnnealingSearch;

import comun.Fichero;
import comun.GeneradorProblemas;
import esc1Caso1.EsEstadoFinal;
import esc1Caso1.Estado;
import esc1Caso1.FuncionSuccesores;
import esc1Caso1.Heuristico;

public class Main3 {

	public static void main(String [] args){
		
		// Generamos 5 estados iniciales
		ArrayList<GeneradorProblemas> generador = new ArrayList<GeneradorProblemas>();
		for (int i = 0; i < 5; ++i) {
			try {
				generador.add(new GeneradorProblemas());
				generador.get(i).generarExperimento1();
			} catch (WrongParametersException e) {
				e.printStackTrace();
			}
		}
		
		// Ejecutamos pruebas con diferentes valores para los parametros del simulated annealing
		Fichero f2 = null;
		try {
			f2 = new Fichero("Experimento 5.txt");
			for(int its = 1000; its < 4000; its = its+1000){
				for (int entropia = 50; entropia < 1000; entropia = entropia*2) {
					for (int k = 10; k < 50; k = k*2) {
						for (float lambda = 0.0f; lambda < 1.0; lambda = lambda + 0.3f) {
							ArrayList<Double>result = new ArrayList<Double>();
							for (int rep = 0; rep < 5; ++rep) {
								double temp = 0;
								for (int i = 0; i < 10; ++i) {
									//Genera el estado inicial
									Estado caso1b = new Estado(generador.get(rep).getPeticiones(), generador.get(rep).getServidores(), generador.get(rep).getNumServidores());
									caso1b.generarEstadoInicialMenorTiempo();
									
									//Crea y resuelve el problema
									Problem problemab = new Problem(caso1b, new FuncionSuccesores(false), new EsEstadoFinal() , new Heuristico());
									Search algoritmob = new SimulatedAnnealingSearch(its, k, entropia, lambda);
									SearchAgent agentb = new SearchAgent(problemab, algoritmob);

									Estado resultadob = (Estado) algoritmob.getGoalState();
									temp +=resultadob.getTiempoMaximo();
								}
								result.add(temp/10);
							}
							String txt = its + " "+entropia+" "+k+" "+lambda+" "+result.get(0)+" "+result.get(1)+" "+result.get(2)+" "+result.get(3)+" "+result.get(4);
							f2.escribe(txt);
							System.out.println(txt);
						}
					}
				}
			}
		}
		catch (WrongParametersException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			f2.cierraF();
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println("FIN");
	}
}
